package qgs.zisu.javaconcurrency.javaconcurrency.chapter6_forceOrGracefulClose;

/**
 * @Author: 蔡翔
 * @Date: 2019/9/24 16:53
 * @Version 1.0
 */
public class ThreadInterrupt {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(){
            @Override
            public void run(){
                while (true){
                    try {
                        //这里的 Thread 指的是 当前线程，这里是 t线程。
                        Thread.sleep(10);
                        System.out.println("THIS Thread is running");
                    } catch (InterruptedException e) {
                        // 即使捕捉到信号 但还是不影响 while循环，如需退出要break
                        System.out.println("收到打断信号");
                        e.printStackTrace();
                        // break 以后就退出了 while，那么t线程就执行完了，t线程空闲后就会被 jvm回收。（这算是一种优雅的关闭 线程方法。）
                        break;
                    }
                }
            }
        };

        t.start();
        // 这里加sleep 是有原因的是为了让main 线程等等 t 线程 先让他创建成功。
        Thread.sleep(100);
        System.out.println(t.isInterrupted());
        // 执行interrupt 会抛出一个异常。
        t.interrupt();
        System.out.println(t.isInterrupted());

        // 启动后 虽然 t.isInterrupted() t 线程被中断了了，但是t里面还在执行while 死循环，没有捕获到Interrupted抛出的异常。
        // 而且t线程也是非守护线程，所以jvm不会把这个线程回收（因为里面的while线程还在跑）
    }
}
